/**
 * @description 获取用户浏览器版本及系统信息
 * @param {string='zh-cn' | 'en'} lang 返回中文的信息还是英文的
 * @constructor
 */
export default function BrowserType(lang: "zh-cn" | "en" = "en") {
	// 权重：系统 + 系统版本 > 平台 > 内核 + 载体 + 内核版本 + 载体版本 > 外壳 + 外壳版本
	const ua = navigator.userAgent.toLowerCase();
	const testUa = (regexp: RegExp) => regexp.test(ua);
	const testVs = (regexp: RegExp) =>
		ua
			.match(regexp)
			?.toString()
			.replace(/[^0-9|_.]/g, "")
			.replace(/_/g, ".");
	// 系统
	const system =
		new Map([
			[testUa(/windows|win32|win64|wow32|wow64/g), "windows"], // windows系统
			[testUa(/macintosh|macintel/g), "macos"], // macos系统
			[testUa(/x11/g), "linux"], // linux系统
			[testUa(/android|adr/g), "android"], // android系统
			[testUa(/ios|iphone|ipad|ipod|iwatch/g), "ios"] // ios系统
		]).get(true) || "unknow";

	// 系统版本
	const systemVs =
		new Map([
			[
				"windows",
				new Map([
					[testUa(/windows nt 5.0|windows 2000/g), "2000"],
					[testUa(/windows nt 5.1|windows xp/g), "xp"],
					[testUa(/windows nt 5.2|windows 2003/g), "2003"],
					[testUa(/windows nt 6.0|windows vista/g), "vista"],
					[testUa(/windows nt 6.1|windows 7/g), "7"],
					[testUa(/windows nt 6.2|windows 8/g), "8"],
					[testUa(/windows nt 6.3|windows 8.1/g), "8.1"],
					[testUa(/windows nt 10.0|windows 10/g), "10"]
				]).get(true)
			],
			["macos", testVs(/os x [\d._]+/g)],
			["android", testVs(/android [\d._]+/g)],
			["ios", testVs(/os [\d._]+/g)]
		]).get(system) || "unknow";

	// 平台
	let platform = "unknow";
	if (system === "windows" || system === "macos" || system === "linux") {
		platform = "desktop"; // 桌面端
	} else if (system === "android" || system === "ios" || testUa(/mobile/g)) {
		platform = "mobile"; // 移动端
	}
	// 内核和载体
	const [engine = "unknow", supporter = "unknow"] = new Map([
		[
			testUa(/applewebkit/g),
			[
				"webkit",
				new Map([
					// webkit内核
					[testUa(/safari/g), "safari"], // safari浏览器
					[testUa(/chrome/g), "chrome"], // chrome浏览器
					[testUa(/opr/g), "opera"], // opera浏览器
					[testUa(/edge/g), "edge"] // edge浏览器
				]).get(true)
			] || "unknow"
		], // [webkit内核, xxx浏览器]
		[testUa(/gecko/g) && testUa(/firefox/g), ["gecko", "firefox"]], // [gecko内核,firefox浏览器]
		[testUa(/presto/g), ["presto", "opera"]], // [presto内核,opera浏览器]
		[testUa(/trident|compatible|msie/g), ["trident", "iexplore"]] // [trident内核,iexplore浏览器]
	]).get(true) || ["unknow", "unknow"];

	// 内核版本
	const engineVs =
		new Map([
			["webkit", testVs(/applewebkit\/[\d._]+/g)],
			["gecko", testVs(/gecko\/[\d._]+/g)],
			["presto", testVs(/presto\/[\d._]+/g)],
			["trident", testVs(/trident\/[\d._]+/g)]
		]).get(engine) || "unknow";

	// 载体版本
	const supporterVs =
		new Map([
			["firefox", testVs(/firefox\/[\d._]+/g)],
			["opera", testVs(/opr\/[\d._]+/g)],
			["iexplore", testVs(/(msie [\d._]+)|(rv:[\d._]+)/g)],
			["edge", testVs(/edge\/[\d._]+/g)],
			["safari", testVs(/version\/[\d._]+/g)],
			["chrome", testVs(/chrome\/[\d._]+/g)]
		]).get(supporter) || "unknow";

	// 外壳和外壳版本
	const [shell = "none", shellVs = "unknow"] = new Map([
		[testUa(/micromessenger/g), ["wechat", testVs(/micromessenger\/[\d._]+/g)]], // [微信浏览器,]
		[testUa(/qqbrowser/g), ["qq", testVs(/qqbrowser\/[\d._]+/g)]], // [QQ浏览器,]
		[testUa(/ucbrowser/g), ["uc", testVs(/ucbrowser\/[\d._]+/g)]], // [UC浏览器,]
		[testUa(/qihu 360se/g), ["360", "unknow"]], // [360浏览器(无版本),]
		[testUa(/2345explorer/g), ["2345", testVs(/2345explorer\/[\d._]+/g)]], // [2345浏览器,]
		[testUa(/metasr/g), ["sougou", "unknow"]], // [搜狗浏览器(无版本),]
		[testUa(/lbbrowser/g), ["liebao", "unknow"]], // [猎豹浏览器(无版本),]
		[testUa(/maxthon/g), ["maxthon", testVs(/maxthon\/[\d._]+/g)]] // [遨游浏览器,]
	]).get(true) || ["none", "unknow"];

	return {
		"zh-cn": Object.assign(
			{
				内核: engine, // 内核: webkit gecko presto trident
				内核版本: engineVs, // 内核版本
				平台: platform, // 平台: desktop mobile
				载体: supporter, // 载体: chrome safari firefox opera iexplore edge
				载体版本: supporterVs, // 载体版本
				系统: system, // 系统: windows macos linux android ios
				系统版本: systemVs // 系统版本
			},
			shell === "none"
				? {}
				: {
						外壳: shell, // 外壳: wechat qq uc 360 2345 sougou liebao maxthon
						外壳版本: shellVs // 外壳版本
					}
		),
		en: Object.assign(
			{
				engine, // 内核: webkit gecko presto trident
				engineVs, // 内核版本
				platform, // 平台: desktop mobile
				supporter, // 载体: chrome safari firefox opera iexplore edge
				supporterVs, // 载体版本
				system, // 系统: windows macos linux android ios
				systemVs // 系统版本
			},
			shell === "none"
				? {}
				: {
						shell, // 外壳: wechat qq uc 360 2345 sougou liebao maxthon
						shellVs // 外壳版本
					}
		)
	}[lang];
}
